import axios from 'axios'
import type { AxiosInstance, AxiosResponse } from 'axios'

// 创建 axios 实例
const service: AxiosInstance = axios.create({
  baseURL: 'http://localhost:8000',  // 后端地址
  timeout: 10000,  // 请求超时时间
  withCredentials: true  // 允许携带cookie，这是关键配置
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    console.log('[HTTP] 发送请求', config)
    // 不需要手动添加Authorization头，因为使用的是session认证
    // withCredentials: true会自动处理cookie
    
    // 如果数据是FormData，删除Content-Type头，让浏览器自动设置
    if (config.data instanceof FormData) {
      delete config.headers['Content-Type']
    }
    
    return config
  },
  (error) => {
    console.error('[HTTP] 请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    console.log('[HTTP] 收到响应', response.status, response.data)
    // 2xx 状态码直接返回数据
    return response.data
  },
  (error) => {
    console.error('[HTTP] 响应错误:', error)
    
    // 如果有响应数据
    if (error.response) {
      const { status, data } = error.response
      console.error('[HTTP] 错误详情', status, data)
      
      // 未授权（仅401）时跳转登录；避免将 302/405 也当作未授权导致登录后再次跳转
      if ((status === 401) && !window.location.pathname.includes('/login')) {
        console.log('[HTTP] 用户未授权，重定向到登录页面')
        // 清除两个存储位置的token
        localStorage.removeItem('userToken')
        localStorage.removeItem('username')
        sessionStorage.removeItem('userToken')
        sessionStorage.removeItem('username')
        window.location.href = '/login'
      }
      
      // 其他错误状态码，返回错误信息供页面处理
      // 400 参数错误、401 认证失败、500 服务器错误等
    }
    
    // 返回 Promise.reject 让调用方的 catch 能捕获到
    return Promise.reject(error)
  }
)

export default service
